/**
 * 生成器
 */
void main() {
  naturalsTo(10);
  asynchronousNaturalsTo(10);
  naturalsDownFrom(10);
}

/**
 * 同步生成器函数
 */
Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++;
}

/**
 * 异步生成器
 */
Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) yield k++;
}

/**
 * 递归
 * 可以使用 yield* 来提高其性能
 */
Iterable<int> naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
  }
}